package com.dragon.modules.yuegou.model.rbac;

import com.dragon.modules.yuegou.enums.code.SystemCode;
import com.dragon.modules.yuegou.web.Check;

/**
 * 权限组<br>
 * 由于悦商圈是一个SaaS平台，存在包括悦商圈运营团队在内的多家企业、组织和团队同时使用，
 * 每个企业、组织和团队都可以对自身可访问的功能进行权限管理。所以要求整套权限系统的数据
 * 按某种方式隔离。此处提出一个权限组的概念，权限组是进行权限管理的单位，不同权限组之间的数据是隔离的。
 * 
 * <p>
 * 例如使用大运营平台的商管云运营团队是一个权限组，使用集团版的A集团是一个权限组，使用集团版的B集团是一个权限组。
 * 
 * <p>
 * 现状：<br>
 * 现在只有大运营后台和集团版后台有权限管理功能<br>
 * 大运营平台存在一个权限组，即大运营权限组；<br>
 * 集团版后台中，每个集团一个权限组，即集团权限组；<br>
 * 
 * 悦商圈APP安卓版、悦商圈APP IOS版、悦购小程序也有弱化的权限管理功能，仅由RBAC模块提供可访问菜单，不在后端做权限控制。
 * 即：悦商圈APP安卓版、悦商圈APP IOS版、悦购小程序等存在商圈权限组的概念，会员进入某个商圈，就属于某个商圈权限组，就只能
 * 访问该商圈权限组下的菜单。
 * 
 * @author liuwu
 *
 */
public class RbacGroup {

	private static final String EMPTY_ID = "0";

	/**
	 * 应用
	 */
	private final RbacApp app;

	/**
	 * 集团ID，用0表示大运营平台
	 */
	private final String groupId;

	/**
	 * 商圈ID
	 */
	private final String busdId;

	private RbacGroup(RbacApp app, String groupId, String busdId) {
		super();
		Check.notNull(app, "必须提供应用");
		Check.notNull(groupId, SystemCode.GROUP_ID_NOTNULL.getMessage());
		Check.notNull(busdId, "必须提供商圈ID");
		this.app = app;
		this.groupId = groupId;
		this.busdId = busdId;
	}

	/**
	 * 获取权限组标识
	 * 
	 * @return 权限组标识
	 */
	public String getId() {
		return "A" + app.getTypeId() + "G" + groupId + "D" + busdId;
	}
	
	/**
	 * 转化成集团权限组
	 * @return 集团权限组
	 */
	public RbacGroup asGroup() {
		return new RbacGroup(app, groupId, EMPTY_ID);
	}

	/**
	 * 应用
	 * 
	 * @return app
	 */
	public RbacApp getApp() {
		return app;
	}

	/**
	 * 判断是否是大运营权限组
	 * 
	 * @return true表示本权限组是大运营权限组
	 */
	public boolean isPlatform() {
		return RbacApp.YSQ_PLATFORM.equals(app) && EMPTY_ID.equals(groupId) && EMPTY_ID.equals(busdId);
	}

	/**
	 * 判断是否是集团权限组
	 * 
	 * @return true表示本权限组是集团权限组
	 */
	public boolean isGroup() {
		return !EMPTY_ID.equals(groupId) && EMPTY_ID.equals(busdId);
	}

	/**
	 * 判断是否是商圈权限组
	 * 
	 * @return true表示本权限组是商圈权限组
	 */
	public boolean isBusd() {
		return !EMPTY_ID.equals(groupId) && !EMPTY_ID.equals(busdId);
	}
	
	/**
	 * 判断是否是商户权限组（商户版后台或悦商惠）
	 * 
	 * @return true表示本权限组是商户权限组
	 */
	public boolean isMerchant() {
		return RbacApp.YSQ_MERCHANT.equals(app) || RbacApp.YSQ_MERCHANT_XCX.equals(app);
	}

	/**
	 * 获取集团ID
	 * 
	 * @return 集团ID，0代表大运营权限组
	 */
	public String getGroupId() {
		return groupId;
	}

	/**
	 * 获取集团ID
	 * 
	 * @return 集团ID，0代表大运营权限组或集团权限组
	 */
	public String getBusdId() {
		return busdId;
	}
	
	@Override
	public String toString() {
		return String.format("权限组 [应用: %s, ID: %s]", app.getAlias(), getId());
	}

	/**
	 * 商圈权限组
	 * 
	 * @param app     权限组所在应用
	 * @param groupId 集团ID
	 * @param busdId  商圈ID
	 * @return RbacGroup
	 */
	public static final RbacGroup busd(RbacApp app, String groupId, String busdId) {
		return new RbacGroup(app, groupId, busdId);
	}

	/**
	 * 集团权限组
	 * 
	 * @param app     权限组所在应用
	 * @param groupId 集团ID
	 * @return RbacGroup
	 */
	public static final RbacGroup newInstance(RbacApp app, String groupId) {
		return new RbacGroup(app, groupId, EMPTY_ID);
	}

	/**
	 * 大运营平台权限组
	 * 
	 * @return RbacGroup
	 */
	public static final RbacGroup platform() {
		return new RbacGroup(RbacApp.YSQ_PLATFORM, EMPTY_ID, EMPTY_ID);
	}
	
	/**
	 * 商户版后台权限组<br>
	 * 请注意：商户权限由大运营管理，商户本身不对自身用户进行权限管理，
	 * 所以整个系统中的商户版后台组只有一个，而非每个商户一个权限组。
	 * 
	 * @return RbacGroup
	 */
	public static final RbacGroup merchant() {
		return new RbacGroup(RbacApp.YSQ_MERCHANT, EMPTY_ID, EMPTY_ID);
	}
	
	/**
	 * 悦商惠权限组<br>
	 * 请注意：商户权限由大运营管理，商户本身不对自身用户进行权限管理，
	 * 所以整个系统中的商惠权权限组只有一个，而非每个商户一个权限组。
	 * 
	 * @return RbacGroup
	 */
	public static final RbacGroup merchantXcx() {
		return new RbacGroup(RbacApp.YSQ_MERCHANT_XCX, EMPTY_ID, EMPTY_ID);
	}

	/**
	 * 集团版权限组
	 * 
	 * @param groupId 集团ID
	 * @return RbacGroup
	 */
	public static final RbacGroup group(String groupId) {
		return new RbacGroup(RbacApp.YSQ_GROUP, groupId, EMPTY_ID);
	}

	/**
	 * 集团在悦商圈APP安卓版的权限组
	 * 
	 * @param groupId 集团ID
	 * @return RbacGroup
	 */
	public static final RbacGroup appAndroid(String groupId) {
		return new RbacGroup(RbacApp.YSQ_APP_ANDROID, groupId, EMPTY_ID);
	}

	/**
	 * 集团在悦商圈APP IOS版的权限组
	 * 
	 * @param groupId 集团ID
	 * @return RbacGroup
	 */
	public static final RbacGroup appIOS(String groupId) {
		return new RbacGroup(RbacApp.YSQ_APP_IOS, groupId, EMPTY_ID);
	}

	/**
	 * 集团在悦购小程序的权限组
	 * 
	 * @param groupId 集团ID
	 * @return RbacGroup
	 */
	public static final RbacGroup xcx(String groupId) {
		return new RbacGroup(RbacApp.YSQ_XCX, groupId, EMPTY_ID);
	}

}
